package org.jsola.hr.service;

import org.jsola.core.Page;
import org.jsola.hr.dto.EmpSocInfoAddBatchDTO;
import org.jsola.hr.dto.SocProgItemUpdateDTO;
import org.jsola.hr.entity.EmpInfoDO;
import org.jsola.hr.query.*;
import org.jsola.hr.vo.*;
import org.jsola.hr.vo.excel.FieldItemGroupVO;
import org.jsola.user.core.TokenUser;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * @author lyh
 */
public interface IEmpSocTransformService {

    /**
     * 社保名单列表显示
     *
     * @param empSocTransformQuery 查询参数
     * @param tokenUser            当前用户
     * @return 社保名单
     */
    Page<EmpSocTransformVO> selectEmpSocList(EmpSocTransformQuery empSocTransformQuery, TokenUser tokenUser);

    /**
     * 补收
     *
     * @param fillSocQuery 查询参数
     * @param tokenUser    当前用户
     */
    void fillGather(FillSocQuery fillSocQuery, TokenUser tokenUser);

    /**
     * 补差
     *
     * @param fillSocQuery 查询参数
     * @param tokenUser    当前用户
     * @return 成功标识
     */
    String fillDifference(FillSocQuery fillSocQuery, TokenUser tokenUser);

    /**
     * 补缴
     *
     * @param fillSocQuery 查询参数
     * @param tokenUser    当前用户
     */
    void pfFillPayment(FillSocQuery fillSocQuery, TokenUser tokenUser);

    /**
     * 补收补缴,预览
     *
     * @param previewFillQuery 预览参数
     * @param tokenUser        当前用户
     * @return 预览对象
     */
    List<SocFillPreviewVO> previewFill(PreviewFillQuery previewFillQuery, TokenUser tokenUser);

    /**
     * 查询某参保方案的使用人数
     *
     * @param socProgId 参保方案Id
     * @param companyId 公司Id
     * @param siteId    站点
     * @return 人数
     */
    SocProgCountAndNextMonthVO selectEmpCountWithSocProgId(String socProgId, String companyId, String siteId);

    /**
     * 社保名单导出数据
     *
     * @param empSocTransformQuery 导出参数
     * @param tokenUser            当前用户
     * @return 表名
     */
    String excelExport(EmpSocTransformQuery empSocTransformQuery, TokenUser tokenUser);

    /**
     * 参保管理导出
     *
     * @param empSocInfoQuery 查询参数
     * @param tokenUser       当前用户
     * @return 表名
     */
    String empSocInfoExport(EmpSocInfoQuery empSocInfoQuery, TokenUser tokenUser);

    /**
     * 社保详情,导出
     *
     * @param companyId        公司Id
     * @param empId            员工Id
     * @param empSocInfoIdList 参保管理Id列表
     * @param tokenUser        当前用户
     * @return 表明
     */
    String empSocDetailsExport(String companyId, String empId, List<String> empSocInfoIdList, TokenUser tokenUser);

    /**
     * 查询社保名单或者参保管理导出的表头
     *
     * @param companyId 公司Id
     * @param monthId   参保月份Id
     * @param tokenUser 当前用户
     * @return 所有表头信息
     */
    List<FieldItemGroupVO> selectAllHead(String companyId, String monthId, TokenUser tokenUser);

    /**
     * 社保名单个人详情
     *
     * @param empSocTransformQuery 查询参数
     * @param tokenUser            当前用户
     * @return 个人详情
     */
    Page<EmpSocTransformVO> selectEmpSocInfoByEmpId(EmpSocTransformQuery empSocTransformQuery, TokenUser tokenUser);

    /**
     * 查询社保名单详情左侧信息
     *
     * @param empId     员工Id
     * @param tokenUser 当前用户
     * @return 详情信息
     */
    EmpSocBrieflyVO selectEmpSocBriefly(String empId, TokenUser tokenUser);

    /**
     * 查询某个月参保管理顶部数量统计
     *
     * @param empSocInfoQuery 查询参数
     * @param tokenUser       当前用户
     * @return 数量信息
     */
    EmpSocTransformCountVO selectEmpSocCount(EmpSocInfoQuery empSocInfoQuery, TokenUser tokenUser);

    /**
     * 查询社保名单顶部数量统计
     *
     * @param companyId 公司Id
     * @param tokenUser 当前用户
     * @return 数量统计
     */
    EmpSocTransformCountVO selectEmpSocListCount(String companyId, TokenUser tokenUser);

    /**
     * 获取所有尾数处理类型
     *
     * @return 所有尾数处理类型
     */
    Map<String, Integer> selectAllMantissaProcessingType();

    /**
     * 社保名单查询参数枚举
     *
     * @param companyId 公司Id
     * @param tokenUser 站点
     * @return 枚举显示
     */
    EmpSocListQueryEnumVO getEmpSocListQueryEnum(String companyId, TokenUser tokenUser);

    /**
     * 尾数处理
     *
     * @param bigDecimal             处理的金额
     * @param mantissaProcessingType 处理的方式
     * @return 处理后的金额
     */
    BigDecimal mantissaProcessing(BigDecimal bigDecimal, Integer mantissaProcessingType);

    /**
     * 社保名单详情顶部金额统计
     *
     * @param companyId 公司Id
     * @param empId     员工Id
     * @param tokenUser 当前用户
     * @return 统计信息
     */
    EmpSocTransformCountVO selectEmpSocInfoByEmpIdCount(String companyId, String empId, TokenUser tokenUser);

    /**
     * 校验传入月是否创建账单
     *
     * @param monthId   参保月Id
     * @param month     月份
     * @param tokenUser 当前用户
     */
    void checkCostBillByMonthId(String monthId, String month, TokenUser tokenUser);

    /**
     * 保存增减员确认的用工档案
     *
     * @param empInfoDO 确认的员工
     * @param year      年
     * @param month     月
     * @param type      类型
     * @param tokenUser 当前用户
     */
    void saveSocPersonalEvent(EmpInfoDO empInfoDO, String year, String month, String type, TokenUser tokenUser);

}
